#include <iostream>
#include <string>
#include <vector>
#include <chrono>
#include <sw/redis++/redis++.h> 
#include "util.hpp"

void test1(sw::redis::Redis &redis)
{
    std::cout << "lpush And lrange 的使用" << std::endl;
    redis.flushall();

    redis.lpush("key", "111");

    redis.lpush("key", {"222", "333", "444"});

    std::vector<std::string> values = {"555", "666", "777"};
    redis.lpush("key", values.begin(), values.end());

    std::vector<std::string> result;
    auto it = std::back_insert_iterator(result);
    redis.lrange("key", 0, -1, it);

    printContainer(result);
}

void test2(sw::redis::Redis &redis)
{
    std::cout << "rpush 的使用" << std::endl;
    redis.flushall();

    redis.rpush("key", "111");

    redis.rpush("key", {"222", "333", "444"});

    std::vector<std::string> values = {"555", "666", "777"};
    redis.rpush("key", values.begin(), values.end());

    std::vector<std::string> result;
    auto it = std::back_insert_iterator(result);
    redis.lrange("key", 0, -1, it);

    printContainer(result);
}

void test3(sw::redis::Redis &redis)
{
    std::cout << "lpop And rpop 的使用" << std::endl;
    redis.flushall();

    redis.rpush("key", "111");
    redis.rpush("key", {"222", "333", "444"});

    auto result = redis.lpop("key");
    if(result) {
        std::cout << "result: " << result.value() << std::endl;
    }

    result = redis.rpop("key");
    if(result) {
        std::cout << "result: " << result.value() << std::endl;
    }
}

void test4(sw::redis::Redis &redis)
{
    std::cout << "blpop 的使用" << std::endl;
    redis.flushall();

    auto result = redis.blpop({"key", "key2", "key3"}, std::chrono::seconds(10));
    if(result) {
        // std::cout << "key: " << result.value().first << std::endl;
        // std::cout << "elem: " << result.value().second << std::endl;
        std::cout << "key: " << result->first << std::endl;
        std::cout << "elem: " << result->second << std::endl;
    } else {
        std::cout << "result 无效" << std::endl;
    }
}

void test5(sw::redis::Redis &redis)
{
    std::cout << "blpop 的使用" << std::endl;
    redis.flushall();

    redis.lpush("key", {"222", "333", "444"});

    long long len = redis.llen("key");
    std::cout << "len: " << len << std::endl;
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");

    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);

    return 0;
}